perm filename MATCH.LSP[C,JRA]1 blob
sn#012878 filedate 1972-11-15 generic text, type T, neo UTF8
00100 (GLOBAL
00200 (FUNCTIONS MATCH ASSIGNED?)
00300 (RESERVED /!> /!< /!/' /!? /!/; /!/,))
00400
00500 (DECLARE (SYMBOLS T) (GENPREFIX '\M) (GENSYM 'M)
00600 (SPECIAL MALIST MALIST1 MALIST2 MALISTV1 MALISTV2 NOBIND VALV)
00700 (*LEXPR MATCH TRYASSIGN RVALUE VLOC)
00800 (*FEXPR CERR))
00900
01000 (DEFUN MATCH N
01100 ((LAMBDA (VARPAT DATAPAT)
01200 (PROG (MALIST1 MALIST2 MALISTV1 MALISTV2 NOBIND)
01300 (COND ((> N 2)
01400 (SETQ MALIST1 (ARG 3) MALIST2 (ARG 4) NOBIND T)) )
01500 (SETQ MALISTV1 (GET 'MALIST1 'VALUE)
01600 MALISTV2 (GET 'MALIST2 'VALUE))
01700 (RETURN (COND ((MATCH1 VARPAT DATAPAT)
01800 (LIST MALIST1 MALIST2)) )) ))
01900 (ARG 1)
02000 (ARG 2) ))
02100
02200 (DECLARE (UNSPECIAL MALIST1 MALIST2))(DEFUN MATCH1 (VARPAT DATAPAT)
02300 (PROG (ACTOR1 ACTOR2)
02400 (RETURN
02500 (COND ((ATOM VARPAT) (MATCH2 DATAPAT VARPAT MALISTV2))
02600 ((ATOM DATAPAT) (MATCH2 VARPAT DATAPAT MALISTV1))
02700 ((EQ (SETQ ACTOR2 (CAR DATAPAT)) '/!/'))
02800 ((MEMQ ACTOR2 '(/!< /!/?))
02900 (MATCH2 VARPAT (ACTORSUBST DATAPAT (CDR MALISTV2)) MALISTV1))
03000 ((EQ (SETQ ACTOR1 (CAR VARPAT)) '/!>)
03100 (/!> (CDR VARPAT) DATAPAT MALISTV1 MALISTV2))
03200 ((EQ ACTOR1 '/!/?)
03300 (/!/? (CDR VARPAT) DATAPAT MALISTV1 MALISTV2 T))
03400 ((EQ ACTOR1 '/!/')
03500 (MBINDR (CADR VARPAT) (CDDR VARPAT) DATAPAT MALISTV1))
03600 ((EQ ACTOR1 '/!<)
03700 (/!< (CADR VARPAT) DATAPAT MALISTV1 MALISTV2))
03800 ((EQ ACTOR1 '/!/,)
03900 (COMMA (CDR VARPAT) DATAPAT MALISTV1 MALISTV2))
04000 ((EQ ACTOR1 '/!/;)
04100 (/!/; (CDR VARPAT) DATAPAT MALISTV1 MALISTV2 T))
04200 ((EQ ACTOR2 '/!>)
04300 (/!/? (CDR DATAPAT) VARPAT MALISTV2 MALISTV1 NIL))
04400 ((EQ ACTOR2 '/!/;)
04500 (/!/; (CDR DATAPAT) VARPAT MALISTV2 MALISTV1 NIL))
04600 ((EQ ACTOR2 '/!/,)
04700 (COMMA (CDR DATAPAT) VARPAT MALISTV2 MALISTV1))
04800 ((MATCH1 (CAR VARPAT) (CAR DATAPAT))
04900 (MATCH1 (CDR VARPAT) (CDR DATAPAT))) )) ))
05000
05100 (DECLARE (UNSPECIAL MALISTV2))(DEFUN COMMA (VARSPEC DATAPAT MV1 MV2)
05200 ((LAMBDA (VAR VALSPEC)
05300 (COND (VALSPEC
05400 ((LAMBDA (VAL)
05500 (COND ((MATCH2 DATAPAT VAL MV2)
05600 (MBINDV VAR VAL MV1)) ))
05700 ((LAMBDA (MALIST) (EVAL (CAR VALSPEC)))
05800 (CDR MV1))))
05900 (((LAMBDA (VAL)
06000 (COND ((EQ VAL '*UNASSIGNED)
06100 (TRYASSIGN VAR DATAPAT (CDR MV1) MV2 (EQ MV1 MALISTV1) NIL))
06200 ((MATCH2 DATAPAT VAL MV2)) ))
06300 ((LAMBDA (MALIST) (/!/,1 VAR)) (CDR MV1)))) ))
06400 (CAR VARSPEC)
06500 (CDR VARSPEC)) )
06600
06700 (DECLARE (UNSPECIAL MALISTV1))
06800
06900
07000 (DEFUN MATCH2 (VARPAT EXP MV)
07100 (COND ((ATOM VARPAT) (EQUAL VARPAT EXP))
07200 (((LAMBDA (ACTOR)
07300 (COND ((MEMQ ACTOR '(/!/? /!> /!/'))
07400 (MBINDR (CADR VARPAT) (CDDR VARPAT) EXP MV))
07500 ((EQ ACTOR '/!/,)
07600 ((LAMBDA (VAR VALSPEC)
07700 (COND (VALSPEC
07800 ((LAMBDA (VAL)
07900 (COND ((EQUAL VAL EXP)
08000 (MBINDV VAR EXP MV)) ))
08100 ((LAMBDA (MALIST) (EVAL (CAR VALSPEC)))
08200 (CDR MV))))
08300
08400 (((LAMBDA (VAL)
08500 (COND ((EQ VAL '*UNASSIGNED)
08600 (MSET VAR EXP (CDR MV)))
08700 ((EQUAL VAL EXP)) ))
08800 ((LAMBDA (MALIST) (/!/,1 VAR))
08900 (CDR MV)))) ))
09000 (CADR VARPAT)
09100 (CDDR VARPAT)))
09200 ((EQ ACTOR '/!/;)
09300 (PROG (VAR VALV RS)
09400 (SETQ VAR (CADR VARPAT) RS (CDDR VARPAT))
09500 (RETURN
09600 (COND ((SETQ VALV (ASSQ VAR (CDR MV)))
09700 (AND (COND ((EQ (SETQ VALV (CADR VALV)) '*UNASSIGNED)
09800 (MSET VAR EXP (CDR MV)))
09900 ((EQUAL VALV EXP)) )
10000 (SATISFY RS (CDR MV))))
10100 ((CHECKVAL VAR)
10200 (AND (EQUAL VALV EXP)
10300 (SATISFY RS (CDR MV))))
10400 ((MBINDR VAR RS EXP MV)) )) ))
10500 ((EQ ACTOR '/!<) NIL)
10600 ((ATOM EXP) NIL)
10700 ((MATCH2 ACTOR (CAR EXP) MV)
10800 (MATCH2 (CDR VARPAT) (CDR EXP) MV)) ))
10900 (CAR VARPAT))) ))(DEFUN /!/? (VARSPEC PAT VALISTV PALISTV VARSALLOWED)
11000 ((LAMBDA (VAR RS VARS)
11100 (COND (VARS
11200 (COND ((OR VARSALLOWED (NOT (HASMUSTASSIGNS VARS)))
11300 (COND ((HASVARS VARS) (MBINDV VAR '*UNASSIGNED VALISTV))
11400 ((OR (NOT VAR)
11500 (MBINDR VAR RS (VARSUBST PAT (CDR PALISTV)) VALISTV))) )) ))
11600 (T (MBINDR VAR RS PAT VALISTV)) ))
11700 (CAR VARSPEC)
11800 (CDR VARSPEC)
11900 (FINDVARS PAT PALISTV)) )
12000
12100
12200 (DEFUN /!> (VARSPEC PAT VALISTV PALISTV)
12300 ((LAMBDA (VAR RS VARS)
12400 (COND (VARS
12500 (COND ((HASVARS VARS) NIL)
12600 (T (OR (NOT VAR)
12700 (MBINDR VAR RS (VARSUBST PAT (CDR PALISTV)) VALISTV))) ))
12800 (T (MBINDR VAR RS PAT VALISTV)) ))
12900 (CAR VARSPEC)
13000 (CDR VARSPEC)
13100 (FINDVARS PAT PALISTV)) )
13200
13300
13400 (DEFUN TRYASSIGN N
13500 ((LAMBDA (VARS VAR PAT MALIST PALISTV VARSALLOWED RS)
13600 (COND (VARS
13700 (COND ((OR VARSALLOWED (NOT (HASMUSTASSIGNS VARS)))
13800 (COND ((HASVARS VARS))
13900 (T ((LAMBDA (VAL)
14000 (MSET VAR VAL MALIST)
14100 (SATISFY RS MALIST))
14200 (VARSUBST PAT (CDR PALISTV)))) )) ))
14300 (T (MSET VAR PAT MALIST) (SATISFY RS MALIST)) ))
14400 (FINDVARS (ARG 2) (ARG 4)) (ARG 1) (ARG 2) (ARG 3) (ARG 4) (ARG 5) (ARG 6)) )
14500
14600
14700
14800 (DEFUN /!< (VAR PAT VALISTV PALISTV)
14900 ((LAMBDA (VARS)
15000 (COND (VARS
15100 (COND ((HASVARS VARS)
15200 (OR (NOT VAR)
15300 (MBIND VAR (VARSUBST PAT (CDR PALISTV)) VALISTV))) )) ))
15400 (FINDVARS PAT PALISTV)) )(DEFUN /!/; (VARSPEC PAT VALISTV PALISTV MUSTBIND)
15500 (PROG (VAR VALV RS)
15600 (SETQ VAR (CAR VARSPEC) RS (CDR VARSPEC))
15700 (RETURN
15800 (COND ((SETQ VALV (ASSQ VAR (CDR VALISTV)))
15900 (COND ((EQ (SETQ VALV (CADR VALV)) '*UNASSIGNED)
16000 (TRYASSIGN VAR PAT (CDR VALISTV) PALISTV MUSTBIND RS))
16100 ((MATCH2 PAT VALV PALISTV) (SATISFY RS (CDR VALISTV))) ))
16200 ((CHECKVAL VAR)
16300 (AND (MATCH2 PAT VALV PALISTV) (SATISFY RS (CDR VALISTV))))
16400 (MUSTBIND
16500 (/!> VARSPEC PAT VALISTV PALISTV))
16600 ((/!/? VARSPEC PAT VALISTV PALISTV NIL)) )) ))
16700
16800
16900 (DEFUN CHECKVAL (VAR)
17000 (COND ((SETQ VALV (VLOC VAR))
17100 (NOT (EQ (SETQ VALV (CADR VALV)) '*UNASSIGNED)))
17200 ((SETQ VALV (BOUNDP VAR))
17300 (NOT (EQ (SETQ VALV (CDR VALV)) '*UNASSIGNED))) ))
17400
17500 (DECLARE (UNSPECIAL VALV))(DEFUN FINDVARS (PAT MALISTV)
17600 (COND ((ATOM PAT) NIL)
17700 (((LAMBDA (CAR)
17800 (COND ((EQ CAR '/!/,)
17900 ((LAMBDA (VAR VALSPEC)
18000 (COND ((OR (NULL VALSPEC) NOBIND)
18100 (GETSPEC '/!/, VAR (CDR MALISTV)))
18200 ((MBINDV VAR
18300 ((LAMBDA (MALIST)
18400 (EVAL (CAR VALSPEC)))
18500 (CDR MALISTV))
18600 MALISTV)
18700 (LIST 'NIL)) ))
18800 (CADR PAT)
18900 (CDDR PAT)))
19000 ((EQ CAR '/!/;)
19100 ((LAMBDA (VAR MALIST)
19200 (COND ((ASSIGNED? VAR) (LIST NIL))
19300 ((OR NOBIND (ASSQ VAR MALIST))
19400 (GETSPEC '/!/; VAR MALIST))
19500 ((MBINDV VAR '*UNASSIGNED MALISTV)
19600 (LIST '/!>)) ))
19700 (CADR PAT)
19800 (CDR MALISTV)))
19900 ((ACTOR CAR)
20000 (COND (NOBIND (GETSPEC CAR (CADR PAT) (CDR MALISTV)))
20100 ((MBINDV (CADR PAT) '*UNASSIGNED MALISTV)
20200 (LIST CAR)) ))
20300 ((NCONC (FINDVARS CAR MALISTV)
20400 (FINDVARS (CDR PAT) MALISTV))) ))
20500 (CAR PAT))) ))
20600
20700
20800 (DEFUN HASMUSTASSIGNS (VARS)
20900 (DO V VARS (CDR V) (NULL V)
21000 (AND (MEMQ (CAR V) '(/!> /!/')) (RETURN T)) ))
21100
21200
21300 (DEFUN HASVARS (VARS)
21400 (DO V VARS (CDR V) (NULL V)
21500 (AND (CAR V) (RETURN T)) ))
21600
21700
21800 (DEFUN VARSUBST (PAT MALIST)
21900 (COND ((ATOM PAT) PAT)
22000 ((ACTOR (CAR PAT))
22100 (ACTORSUBST PAT MALIST))
22200 ((CONS (VARSUBST (CAR PAT) MALIST)
22300 (VARSUBST (CDR PAT) MALIST))) ))
22400
22500
22600 (DEFUN ACTOR (ATOM)
22700 (MEMQ ATOM '(/!> /!/? /!/' /!< /!/, /!/;)) )
22800
22900
23000 (DEFUN ACTORSUBST (PAT MALIST)
23100 ((LAMBDA (VAR)
23200 ((LAMBDA (VAL)
23300 (COND ((EQ VAL '*UNASSIGNED) PAT) (VAL) ))
23400 (/!/,1 VAR)))
23500 (CADR PAT)) )
23600
23700
23800 (DEFUN GETSPEC (ACTOR VAR MALIST)
23900 (COND ((EQ (/!/,1 VAR) '*UNASSIGNED)
24000 (COND (NOBIND (CERR UNASSIGNED VARIABLE IN INSTANCE))
24100 ((LIST ACTOR)) ))
24200 ((LIST NIL)) ))(DEFUN MBIND (VAR VAL ALISTV)
24300 (COND (NOBIND (MSET VAR VAL (CDR ALISTV)))
24400 ((RPLACD ALISTV (CONS (LIST VAR VAL) (CDR ALISTV)))) ))
24500
24600
24700 (DEFUN MBINDV (VAR VAL ALISTV)
24800 (COND ((NOT VAR))
24900 (NOBIND (MSET VAR VAL (CDR ALISTV)))
25000 ((RPLACD ALISTV (CONS (LIST VAR VAL) (CDR ALISTV)))) ))
25100
25200 (DECLARE (UNSPECIAL NOBIND))
25300
25400
25500 (DEFUN MBINDR (VAR RESTRICTIONS VAL ALISTV)
25600 (OR (NOT VAR)
25700 (AND (MBIND VAR VAL ALISTV)
25800 (SATISFY RESTRICTIONS (CDR ALISTV)))) )
25900
26000
26100 (DEFUN /!/, FEXPR (L) (/!/,1 (CAR L)))
26200
26300
26400 (DEFUN /!/,1 (VAR/ )
26500 ((LAMBDA (PAIR)
26600 (COND (PAIR (CADR PAIR)) ((RVALUE VAR/ )) ))
26700 (ASSQ VAR/ MALIST)) )
26800
26900
27000 (DEFUN SATISFY (RS MALIST)
27100 (OR (NULL RS)
27200 (APPLY 'AND RS)) )
27300
27400 (DECLARE (UNSPECIAL MALIST))
27500
27600
27700 (DEFUN MSET (VAR VAL MALIST)
27800 ((LAMBDA (PAIR)
27900 (COND (PAIR (RPLACA (CDR PAIR) VAL) VAL)
28000 ((CERR VARIABLE @VAR UNBOUND IN MATCH ALIST)) )
28100 T)
28200 (ASSQ VAR MALIST)) )
28300
28400
28500 (DEFUN ASSIGNED? (VAR)
28600 (PROG (VAL)
28700 (RETURN
28800 (COND ((SETQ VAL (VLOC VAR)) (NOT (EQ (CADR VAL) '*UNASSIGNED)))
28900 ((SETQ VAL (BOUNDP VAR)) (NOT (EQ (CDR VAL) '*UNASSIGNED))) )) ))